package com.project.gobang.game;

import org.springframework.stereotype.Component;

import java.util.concurrent.ConcurrentHashMap;

// "房间管理器" 这个类, 应该是唯一实例(Bean的作用域有讲到)
// 因此使用注解交给 Spring 容器进行管理
@Component
public class RoomManager {
    // 这个哈希表结构就用来管理房间
    private ConcurrentHashMap<String, Room> rooms = new ConcurrentHashMap<>();

    // 这个哈希表就用来表示: 通过 玩家id 找到 游戏房间id
    private ConcurrentHashMap<Integer, String> userIdToRoomId = new ConcurrentHashMap<>();

    // 添加房间
    public void add(Room room, int userId1, int userId2) {
        rooms.put(room.getRoomId(), room);
        // 添加房间时, 就可以添加 玩家id -> 房间id 的映射关系
        // 注意添加的 userId, 需要从参数中来, 因为此时的房间中还是空的, 并没有玩家信息
        userIdToRoomId.put(userId1, room.getRoomId());
        userIdToRoomId.put(userId2, room.getRoomId());
    }

    // 移除房间
    public void remove(String roomId, int userId1, int userId2) {
        rooms.remove(roomId);
        // 相应的, 如果将房间删除, 对应的 userId -> roomId 映射也要删除
        userIdToRoomId.remove(userId1);
        userIdToRoomId.remove(userId2);
    }

    // 查找房间
    public Room getRoomByRoomId(String roomId) {
        return rooms.get(roomId);
    }

    // 通过该方法进行封装: 通过 玩家id 直接拿到玩家所属房间
    // 这样的好处是之后拿到用户所在房间直接调用这一个方法就好.
    public Room getRoomByUserId(int userId) {
        String roomId = userIdToRoomId.get(userId);
        if (roomId == null) {
            // userId -> roomId 的映射不存在, 说明该用户不存在任何房间内
            return null;
        }
        return rooms.get(roomId);
    }
}
